// 箭头函数的特点

let divide = (a,b) => a / b ;
let result = divide(100,2);
console.log( result );

console.log( '- - - - - - - -' );

let names = Object.getOwnPropertyNames( divide );
console.log( names );
// 每个箭头函数都只有两个自有属性: name 和 length
console.log( '名称' , divide.name );
console.log( '形参个数', divide.length );

console.log( '- - - - - - - -' );

// 箭头函数没有原型(没有prototype属性)
console.log( divide.prototype ); // undefined
console.log( divide.__proto__ === Function.prototype ); // true
console.log( Object.getPrototypeOf( divide ) === Function.prototype ); // true

// 箭头函数也从Function对象的原型上继承属性和函数
console.log( divide.toString() ); // Function.prototype.toString()

result = divide.call( null, 5 , 2 ); // Function.prototype.call
console.log( result );

result = divide.apply( null, [ 90 , 3 ] ); // Function.prototype.apply
console.log( result );

let fun = divide.bind( null ); // Function.prototype.bind
result = fun( 45 , 15 );
console.log( result );

console.log( '- - - - - - - -' );

let Student = (id,name,gender) => {
    // 箭头函数中的this是根据箭头函数所在上下文确定的
    // 箭头函数内的this并不表示箭头函数本身或其实例
    this.id = id ;
    this.name = name ;
    this.gender = gender ;
}

// 箭头函数不可当作构造函数使用
// let s = new Student(); // TypeError: Student is not a constructor

// 以非构造函数形式调用箭头函数
let x = Student( 1001 , '朱重八' , '靓仔' );
console.log( x );

console.log( this.id , this.name , this.gender );

console.log( '- - - - - - - -' );

let add = (a,b) => {
    // 箭头函数内不可以通过arguments获得箭头函数本身的实参
    // 但是可以使用上下文中已经存在的 arguments 变量
    console.log( arguments );
}

add(1,2,3,4,5);